Skip to content

Commit 9b96502

Browse files
committed
Improve JS/HTML syntax highlighting
1 parent 14713b5 commit 9b96502

7 files changed

+65
-18
lines changed

llamafile/highlight.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -239,7 +239,9 @@ class HighlightJs : public Highlight {
239239
int u_ = 0;
240240
int t_ = 0;
241241
int expect_;
242+
int nesti_ = 0;
242243
std::string word_;
244+
unsigned char nest_[16];
243245
};
244246

245247
class HighlightTypescript : public Highlight {

llamafile/highlight_html.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -206,7 +206,7 @@ void HighlightHtml::feed(std::string *r, std::string_view input) {
206206
if (name_ == "script") {
207207
pending_.clear();
208208
closer_ = "</script>";
209-
highlighter_ = new HighlightC(is_keyword_js);
209+
highlighter_ = new HighlightJs;
210210
t_ = RELAY;
211211
i_ = 0;
212212
} else if (name_ == "style") {

llamafile/highlight_js.cpp

Lines changed: 45 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ enum {
3333
SLASH_STAR_STAR,
3434
TICK,
3535
TICK_BACKSLASH,
36+
TICK_DOLLAR,
3637
REGEX,
3738
REGEX_BACKSLASH,
3839
REGEX_SQUARE,
@@ -99,18 +100,26 @@ void HighlightJs::feed(std::string *r, std::string_view input) {
99100
} else if (c == '\'') {
100101
t_ = QUOTE;
101102
*r += HI_STRING;
102-
lf::append_wchar(r, c);
103+
*r += '\'';
103104
expect_ = EXPECT_OPERATOR;
104105
} else if (c == '"') {
105106
t_ = DQUOTE;
106107
*r += HI_STRING;
107-
lf::append_wchar(r, c);
108+
*r += '"';
108109
expect_ = EXPECT_OPERATOR;
109110
} else if (c == '`') {
110111
t_ = TICK;
111112
*r += HI_STRING;
112-
lf::append_wchar(r, c);
113+
*r += '`';
113114
expect_ = EXPECT_OPERATOR;
115+
} else if (c == '{' && nesti_ && nesti_ < sizeof(nest_)) {
116+
expect_ = EXPECT_VALUE;
117+
*r += '{';
118+
nest_[nesti_++] = NORMAL;
119+
} else if (c == '}' && nesti_) {
120+
if ((t_ = nest_[--nesti_]) != NORMAL)
121+
*r += HI_STRING;
122+
*r += '}';
114123
} else if (c == ')' || c == '}' || c == ']') {
115124
expect_ = EXPECT_OPERATOR;
116125
lf::append_wchar(r, c);
@@ -240,13 +249,19 @@ void HighlightJs::feed(std::string *r, std::string_view input) {
240249
t_ = DQUOTE;
241250
break;
242251

252+
Tick:
243253
case TICK:
244-
lf::append_wchar(r, c);
245254
if (c == '`') {
255+
*r += '`';
246256
*r += HI_RESET;
247257
t_ = NORMAL;
258+
} else if (c == '$') {
259+
t_ = TICK_DOLLAR;
248260
} else if (c == '\\') {
261+
*r += '\\';
249262
t_ = TICK_BACKSLASH;
263+
} else {
264+
lf::append_wchar(r, c);
250265
}
251266
break;
252267

@@ -255,6 +270,27 @@ void HighlightJs::feed(std::string *r, std::string_view input) {
255270
t_ = TICK;
256271
break;
257272

273+
case TICK_DOLLAR:
274+
if (c == '{' && nesti_ < sizeof(nest_)) {
275+
*r += HI_BOLD;
276+
*r += '$';
277+
*r += HI_UNBOLD;
278+
*r += HI_STRING;
279+
*r += '{';
280+
*r += HI_RESET;
281+
expect_ = EXPECT_VALUE;
282+
nest_[nesti_++] = TICK;
283+
t_ = NORMAL;
284+
} else {
285+
*r += HI_WARNING;
286+
*r += '$';
287+
*r += HI_UNBOLD;
288+
*r += HI_STRING;
289+
t_ = TICK;
290+
goto Tick;
291+
}
292+
break;
293+
258294
case REGEX:
259295
lf::append_wchar(r, c);
260296
if (c == '/') {
@@ -316,6 +352,10 @@ void HighlightJs::flush(std::string *r) {
316352
case SLASH:
317353
*r += '/';
318354
break;
355+
case TICK_DOLLAR:
356+
*r += '$';
357+
*r += HI_RESET;
358+
break;
319359
case TICK:
320360
case TICK_BACKSLASH:
321361
case QUOTE:
@@ -337,4 +377,5 @@ void HighlightJs::flush(std::string *r) {
337377
c_ = 0;
338378
u_ = 0;
339379
t_ = NORMAL;
380+
nesti_ = 0;
340381
}

llamafile/highlight_kotlin.cpp

Lines changed: 14 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -30,20 +30,20 @@ enum {
3030
SLASH_SLASH,
3131
SLASH_STAR,
3232
SLASH_STAR_STAR,
33-
DQUOTE, // "
34-
DQUOTE_DOLLAR, // "
35-
DQUOTE_VAR, // "
36-
DQUOTESTR, // "...
37-
DQUOTESTR_BACKSLASH, // "...
38-
DQUOTESTR_DOLLAR, // "...
39-
DQUOTESTR_VAR, // "...
40-
DQUOTE2, // ""
41-
DQUOTE3, // """...
33+
DQUOTE,
34+
DQUOTE_DOLLAR,
35+
DQUOTE_VAR,
36+
DQUOTESTR,
37+
DQUOTESTR_BACKSLASH,
38+
DQUOTESTR_DOLLAR,
39+
DQUOTESTR_VAR,
40+
DQUOTE2,
41+
DQUOTE3,
4242
DQUOTE3_BACKSLASH,
43-
DQUOTE3_DOLLAR, // """...
44-
DQUOTE3_VAR, // """...
45-
DQUOTE31, // """..."
46-
DQUOTE32, // """...""
43+
DQUOTE3_DOLLAR,
44+
DQUOTE3_VAR,
45+
DQUOTE31,
46+
DQUOTE32,
4747
};
4848

4949
HighlightKotlin::HighlightKotlin() {
@@ -384,4 +384,5 @@ void HighlightKotlin::flush(std::string *r) {
384384
break;
385385
}
386386
t_ = NORMAL;
387+
nesti_ = 0;
387388
}

llamafile/highlight_scala.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -384,4 +384,5 @@ void HighlightScala::flush(std::string *r) {
384384
break;
385385
}
386386
t_ = NORMAL;
387+
nesti_ = 0;
387388
}

llamafile/highlight_swift.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -452,4 +452,5 @@ void HighlightSwift::flush(std::string *r) {
452452
c_ = 0;
453453
u_ = 0;
454454
t_ = NORMAL;
455+
nesti_ = 0;
455456
}

llamafile/highlight_typescript.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -368,4 +368,5 @@ void HighlightTypescript::flush(std::string *r) {
368368
c_ = 0;
369369
u_ = 0;
370370
t_ = NORMAL;
371+
nesti_ = 0;
371372
}

0 commit comments

Comments
 (0)